<?php
/**
 * 简单的多进程处理业务的
 * 示例
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/11/30 0030
 * Time: 21:10
 */

$workers = [];
$worker_num = 40; // 进程数
$message = [];


// 批量创建

/**
 * 实验证明进程的消息队列无法实现一对一定点通信，
 * 这种通信方式它试用于生产者消费者模式的业务处理，
 */
for($i= 0; $i < $worker_num; $i++) {
    $process = new swoole_process(function(swoole_process $process) use($i) {
        $recv = $process->pop(); // 获取数据 ，默认8192
        echo "从主进程获取来自【{$i}】的数据： $recv \n";
        sleep(2);
        $process->exit(0);
    }, false, false);// 第三个参数false，进程通信
    $process->useQueue(1, 2 | swoole_process::IPC_NOWAIT); // 开启队列，类似于全局函数
    $pid = $process->start();
    $workers[$i] = $process;
    $message[$i] = '我是进程['. $pid . '-' . "$i]发送的消息";

}
// 主进程向子进程添加数据
foreach ($workers as $i => $process) {
    //$process->freeQueue();
    $process->push($message[$i]);
}

// 等待子进程结束 回收资源
for($i= 0; $i< $worker_num; $i++) {
    $ret = swoole_process::wait();// 等待执行完成；

    $pid = $ret['pid'];
    unset($workers[$pid]);
    echo "finish : $pid \n";
}